//package com.roc.template.redis;
//
//import org.apache.commons.collections.CollectionUtils;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
//import org.springframework.cache.annotation.CachingConfigurerSupport;
//import org.springframework.cache.annotation.EnableCaching;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.data.redis.connection.RedisConnectionFactory;
//import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
//import org.springframework.data.redis.core.RedisTemplate;
//import redis.clients.jedis.JedisPoolConfig;
//
//import java.util.HashSet;
//import java.util.Set;
//
///**
// * redisTemplet 配置
// */
//@Configuration
//@EnableCaching
//@ConditionalOnProperty(name = "redis.mode", havingValue = "stand-alone")
//public class RedisConfig extends CachingConfigurerSupport {
//
//	//服务器主机
//	@Value("${spring.redis.host}")
//	private String host;
//
//	//Redis服务器端口
//	@Value("${spring.redis.port}")
//	private int port;
//
//	//以毫秒为单位的连接超时
//	@Value("${spring.redis.timeout}")
//	private int timeout;
//
//	//池在给定时间可以分配的最大连接数。使用负值无限制。
//	@Value("${spring.redis.pool.max-active}")
//	private int maxActive;
//
//	//池中“空闲”连接的最大数量。使用负值表示无限数量的空闲连接
//	@Value("${spring.redis.pool.max-idle}")
//	private int maxIdle;
//
//	//目标为保持在池中的最小空闲连接数。这个设置只有在正面的情况下才有效果
//	@Value("${spring.redis.pool.max-wait}")
//	private long maxWait;
//
//	//目标为保持在池中的最小空闲连接数。这个设置只有在正面的情况下才有效果
//	@Value("${spring.redis.pool.min-idle}")
//	private int minIdle;
//
//	//登录redis服务器的密码
//	@Value("${spring.redis.password}")
//	private String password;
//
//	//（哨兵模式，不使用则不用开启）Redis服务器的名称
//	@Value("${spring.redis.sentinel.master}")
//	private String REDIS_SENTINEL_MASTER_NAME;
//
//	//（哨兵模式，不使用则不用开启）主机：端口对的逗号分隔列表
//	@Value("${spring.redis.sentinel.nodes}")
//	private String REDIS_SENTINELS_NODES;
//
//	public static Set<String> REDIS_SENTINELS_ADDRESSES=new HashSet<String>();
//
//	private void init() {
//		if(CollectionUtils.isEmpty(REDIS_SENTINELS_ADDRESSES)){
//			String []sentinelArr=REDIS_SENTINELS_NODES.split(",");
//			if(sentinelArr!=null){
//				for(String sen:sentinelArr){
//					if(sen!=null){
//						REDIS_SENTINELS_ADDRESSES.add(sen);
//					}
//				}
//			}
//		}
//	}
//
//	/**
//	 * JedisPoolConfig 连接池
//	 * @return
//	 */
//	@Bean
//	public JedisPoolConfig jedisPoolConfig() {
//		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//		// 最大空闲数
//		jedisPoolConfig.setMaxIdle(maxIdle);
//		// 连接池的最大数据库连接数
//		jedisPoolConfig.setMaxTotal(maxActive);
//		// 最大建立连接等待时间
//		jedisPoolConfig.setMaxWaitMillis(maxWait);
//
//		jedisPoolConfig.setMinIdle(minIdle);
//		// 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
//		jedisPoolConfig.setMinEvictableIdleTimeMillis(60000);
//		// 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
//		jedisPoolConfig.setNumTestsPerEvictionRun(-1);
//		// 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
//		jedisPoolConfig.setTimeBetweenEvictionRunsMillis(30000);
//		// 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
//		jedisPoolConfig.setTestOnBorrow(true);
//		// 在空闲时检查有效性, 默认false
//		jedisPoolConfig.setTestWhileIdle(true);
//		//当调用return Object方法时，是否进行有效性检查
//		jedisPoolConfig.setTestOnReturn(false);
//		return jedisPoolConfig;
//	}
//
//
//
//	/**
//	 * 单机版配置
//	 * @param jedisPoolConfig
//	 * @return
//	 */
//	@Bean
//	public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig){
//		JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
//		//连接池
//		JedisConnectionFactory.setPoolConfig(jedisPoolConfig);
//		//IP地址
//		JedisConnectionFactory.setHostName(host);
//		//端口号
//		JedisConnectionFactory.setPort(port);
//		//如果Redis设置有密码
//		JedisConnectionFactory.setPassword(password);
//		//客户端超时时间单位是毫秒
//		JedisConnectionFactory.setTimeout(timeout);
//		JedisConnectionFactory.setUseSsl(false);
//
//		return JedisConnectionFactory;
//	}
//
//	@Bean
//	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory){
//		RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
//		redisTemplate.setConnectionFactory(factory);
//		// 开启事务
////	        redisTemplate.setEnableTransactionSupport(true);
//		// key序列化方式;（不然会出现乱码;）,但是如果方法上有Long等非String类型的话，会报类型转换错误；
//		// 所以在没有自己定义key生成策略的时候，以下这个代码建议不要这么写，可以不配置或者自己实现ObjectRedisSerializer
//		// 或者JdkSerializationRedisSerializer序列化方式;
////	        RedisSerializer<String> redisSerializer = new StringRedisSerializer();// Long类型不可以会出现异常信息;
////	        redisTemplate.setKeySerializer(redisSerializer);
////	        redisTemplate.setHashKeySerializer(redisSerializer);
//
////	        redisTemplate.setKeySerializer(new StringRedisSerializer());
////	        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
////	        redisTemplate.setValueSerializer(new KryoRedisSerializer());
////	        redisTemplate.setHashValueSerializer(new KryoRedisSerializer());
//		return redisTemplate;
//	}
//}
